package com.yami.shop.service;

import org.springframework.stereotype.Service;



// ... 导入部分保持不变 ...

/**
 * @author DELL
 */
@Service
public class CFRecommenderService {
//    /**
//     * 用户行为数据访问接口，用于获取用户行为记录
//     */
//    @Resource
//    private UserBehaviorMapper userBehaviorMapper;
//
//    /**
//     * Spark会话实例，用于创建Spark上下文
//     */
//    private final SparkSession sparkSession;
//
//    /**
//     * ALS模型参数：潜在因子数量（默认值10）
//     */
//    @Value("${spark.als.rank:10}")
//    private int rank;
//
//    /**
//     * ALS模型参数：迭代次数（默认值10）
//     */
//    @Value("${spark.als.iterations:10}")
//    private int numIterations;
//
//    /**
//     * ALS模型参数：正则化系数（默认值0.01）
//     */
//    @Value("${spark.als.lambda:0.01}")
//    private double lambda;
//
//    /**
//     * 构造函数注入SparkSession实例
//     * @param sparkSession Spark会话对象，用于初始化Spark上下文
//     */
//    @Autowired
//    public CFRecommenderService(SparkSession sparkSession) {
//        this.sparkSession = sparkSession;
//    }
//
//    /**
//     * 生成推荐商品列表
//     * @param userId 用户ID字符串
//     * @param numRecommendations 需要返回的推荐数量
//     * @return 推荐商品ID字符串列表，按推荐分数降序排列
//     * @throws IllegalArgumentException 当用户ID格式无效时抛出
//     */
//    public List<String> recommendItems(String userId, int numRecommendations) {
//        try {
//            // 数据准备阶段：获取并转换用户行为数据
//            List<UserBehavior> behaviors = userBehaviorMapper.selectAll();
//            JavaRDD<Rating> ratings = convertToRatings(behaviors);
//
//            // 模型训练阶段：使用ALS算法训练推荐模型
//            MatrixFactorizationModel model = trainALSModel(ratings);
//
//            // 推荐生成阶段：生成指定数量的推荐结果
//            Rating[] recommendations = model.recommendProducts(Integer.parseInt(userId), numRecommendations);
//            return Arrays.stream(recommendations)
//                    .map(r -> String.valueOf(r.product()))
//                    .collect(Collectors.toList());
//        } catch (NumberFormatException e) {
//            throw new IllegalArgumentException("Invalid user ID format: " + userId, e);
//        }
//    }
//
//    /**
//     * 将用户行为数据转换为Spark Rating RDD
//     * @param behaviors 原始用户行为数据列表
//     * @return 转换后的Rating RDD，包含有效用户行为数据
//     * @throws IllegalArgumentException 当存在无效用户ID时抛出
//     */
//    private JavaRDD<Rating> convertToRatings(List<UserBehavior> behaviors) {
//        JavaSparkContext jsc = JavaSparkContext.fromSparkContext(sparkSession.sparkContext());
//
//        return jsc.parallelize(behaviors)
//                // 过滤无效数据（用户ID或商品ID为空的记录）
//                .filter(behavior -> behavior.getUserId() != null && behavior.getProdId() != null)
//                // 转换为Rating对象，处理格式转换异常
//                .map(behavior -> {
//                    try {
//                        int userId = Integer.parseInt(behavior.getUserId());
//                        int productId = behavior.getProdId().intValue();
//                        Integer rating = calculateRating(behavior.getBehaviorType(), behavior.getWeight());
//                        return new Rating(userId, productId, rating);
//                    } catch (NumberFormatException e) {
//                        throw new IllegalArgumentException("Invalid user ID in behavior data: " + behavior.getUserId(), e);
//                    }
//                });
//    }
//
//    /**
//     * 根据用户行为类型计算评分值
//     * @param behaviorType 用户行为类型枚举
//     * @param weight 行为权重值（可为空或非正数）
//     * @return 计算后的评分值，基础权重默认为1
//     */
//    private Integer calculateRating(BehaviorTypeEnum behaviorType, Integer weight) {
//        final Integer baseWeight = (weight == null || weight <= 0) ? 1 : weight;
//
//        switch (behaviorType) {
//            case PURCHASE: return 5 * baseWeight;  // 购买行为最高权重
//            case FAVORITE: return 3 * baseWeight;  // 收藏行为中等权重
//            case CART: return 2 * baseWeight;      // 加购行为较低权重
//            case VIEW: return 1 * baseWeight;      // 浏览行为基础权重
//            default: return 0;                     // 未知行为不计分
//        }
//    }
//
//    /**
//     * 训练ALS矩阵分解模型
//     * @param ratings 评分数据RDD
//     * @return 训练完成的矩阵分解模型
//     */
//    private MatrixFactorizationModel trainALSModel(JavaRDD<Rating> ratings) {
//        return ALS.train(
//                ratings.rdd(),
//                rank,
//                numIterations,
//                lambda
//        );
//    }
}
